/**
 * 这是关于评论操作的类
 */
var markdown=require('markdown').markdown;
var mongodb=require('./db');
//name:是发布文章人的名字   username：是提交评论人的名字
function Comment(name,username,title,second,comment) {
    this.name=name;
    this.username=username;
    this.title=title;
    this.second=second;
    this.comment=comment;
}
module.exports=Comment;
Comment.prototype.save=function (callback) {
    var date=new Date();
    var time={
        year:date.getFullYear(),
        month:date.getFullYear()+'-'+((date.getMonth()+1)<10?'0'+(date.getMonth()+1):(date.getMonth()+1)),
        date:date.getFullYear()+'-'+((date.getMonth()+1)<10?'0'+(date.getMonth()+1):(date.getMonth()+1))+'-'+
        (date.getDate()<10?'0'+date.getDate():date.getDate()),
        second:date.getFullYear()+'-'+((date.getMonth()+1)<10?'0'+(date.getMonth()+1):(date.getMonth()+1))+'-'+
        (date.getDate()<10?'0'+date.getDate():date.getDate())+' '+(date.getHours()<10?'0'+date.getHours():date.getHours())+
        ':'+(date.getMinutes()<10?'0'+date.getMinutes():date.getMinutes())+':'+(date.getSeconds()<10?'0'+date.getSeconds():date.getSeconds())
    }
    var newcomment={
        name:this.name,
        username:this.username,
        title:this.title,
        //发表文章的时间
        second:this.second,
        comment:this.comment,
        time:time,
        //回复评论的内容，这次我放在一个数组里
        reply:[],
        replyPeople:[],
        replyTime:[]
    }
    mongodb.open(function (err,db) {
        if(err){
            return callback(err);
        }
        //读取数据库的集合commemnts
        db.collection('comments',function (err,collection) {
            if(err){
                mongodb.close();
                return callback(err);
            }
            //对集合进行操作，这里不能以title作为唯一索引，否则只能评论一次
            // collection.ensureIndex('title',{unique:true});
            collection.insert(newcomment,{safe:true},function (err) {
                mongodb.close();
                if(err){
                    return callback(err);
                }
                //保存成功
                return callback(null);
            })
        })
    })
}
//查询评论,这里的name是发布文章的name不是代表当前用户,我这里是将发布文章的用户名和标题为
//索引来加评论，然后再以这两项索引去查询评论
Comment.get=function (name,title,second,page,callback) {
    mongodb.open(function (err,db) {
        if(err){
            return callback(err);
        }
        //读取数据库comments集合
        db.collection('comments',function (err,collection) {
            if(err){
                mongodb.close();
                return callback(err);
            }
            //获取评论数
            var query={
                name:name,
                title:title,
                //发布文章的时间
                second:second
            }

            collection.count(query,function (err,total) {
                if(err){
                    return callback(err);
                }
                //进行查询评论
                collection.find(query,{limit:3,skip:(page-1)*3}).sort({'time.second':-1}).toArray(function (err,coms) {
                    if(err){
                        return callback(err);
                    }
                    //获取成功
                    coms.forEach(function (com,index) {
                        com.comment=markdown.toHTML(com.comment);
                    })
                    return callback(null,coms,total);
                })
            })

        })
    })
}
//删除一条评论
Comment.remove=function (name,second,callback) {
    var query={
        username:name,
        //发表评论的时间
        'time.second':second
    }
    mongodb.open(function (err,db) {
        if(err){
            return callback(err);
        }
        //读取数据库的集合
        db.collection('comments',function (err,collection) {
            if(err){
                mongodb.close();
                return callback(err);
            }
            //{justOne:true}:只删除第一个符合条件的数据
            collection.remove(query,{justOne:true},function (err) {
                mongodb.close();
                if(err){
                    return callback(err);
                }
                //删除成功
                return callback(null);
            })
        })
    })
}

//思路：回复内容，根据提交文章人的名字、标题和提交评论的时间进行查询。在保存评论时，将回复人（replyPeople，其实就是当前登录用户）、回复内容（reply）和
    //回复时间（replyTime）都置为空数组，然后在提交回复的时候，将这三个属性都更新到数组里，所以他们三个的属性值的数量永远都是一样的
    //这就便于了他们在前面的模板通过循环进行倒叙取值
Comment.reply=function (reply,replyPeople,name,title,second,callback) {
    mongodb.open(function (err,db) {
        if(err){
            return callback(err);
        }
        db.collection('comments',function (err,collection) {
            if(err){
                mongodb.close();
                return callback(err);
            }

            var query={
                name:name,
                title:title,
                'time.second':second
            }
            var date=new Date();
            var replyTime=date.getFullYear()+'-'+((date.getMonth()+1)<10?'0'+(date.getMonth()+1):(date.getMonth()+1))+'-'+
            (date.getDate()<10?'0'+date.getDate():date.getDate())+' '+(date.getHours()<10?'0'+date.getHours():date.getHours())+
            ':'+(date.getMinutes()<10?'0'+date.getMinutes():date.getMinutes())+':'+(date.getSeconds()<10?'0'+date.getSeconds():date.getSeconds())
            collection.findOne(query,function (err,com) {
                if(err){
                    return callback(err);
                }
                //进行更新回复操作
                if(com){
                    //$push:在更新操作时，将回复内容加入reply数组中
                    collection.update(query,{
                        //在$push:{}里除了可以写字段field(数组字段名):value，将元素写入放到数组里，还可以写$sort:{}里面写field：1/-1，进行正序/倒序
                        $push: {reply:reply,replyPeople:replyPeople,replyTime:replyTime}
                    },function (err) {
                        mongodb.close();
                        if(err){
                            return callback(err);
                        }
                        //更新操作成功
                        com.comment=markdown.toHTML(com.comment);
                        com.reply.forEach(function (item,index) {
                            item=markdown.toHTML(item);
                        })
                        return callback(null,com);
                    })
                }
            })
        })
    })
}
